home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
boot
/
czesc_2
/
toolmanager
/
source
/
prefs
/
imagewindow.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-05-15
|
14KB
|
509 lines
/*
* imagewindow.c V2.1
*
* image edit window handling
*
* (c) 1990-1993 Stefan Becker
*/
#include "ToolManagerConf.h"
/* Image node */
struct ImageNode {
struct Node in_Node;
char *in_File;
};
/* Window data */
static struct Gadget *gl; /* Gadget list */
static struct Window *w; /* Window */
static void *aw; /* AppWindow pointer */
static UWORD ww,wh; /* Window size */
static struct ImageNode *CurrentNode;
static char *DirName=NULL;
static struct Requester DummyReq;
/* Gadget data */
#define GAD_NAME_STR 0
#define GAD_FILE_BUT 1
#define GAD_FILE_TXT 2
#define GAD_FILE_STR 3
#define GAD_OK 4
#define GAD_CANCEL 5
#define GADGETS 6
static struct GadgetData gdata[GADGETS];
/* Gadget tags */
static struct TagItem nametags[]={GTST_String, NULL,
GTST_MaxChars, SGBUFLEN,
TAG_DONE};
static struct TagItem filetags[]={GTST_String, NULL,
GTST_MaxChars, SGBUFLEN,
TAG_DONE};
/* Gadget vanilla key data */
#define KEY_NAME 0
#define KEY_FILE 1
#define KEY_OK 2
#define KEY_CANCEL 3
static char KeyArray[KEY_CANCEL+1];
/* Init image edit window */
void InitImageEditWindow(UWORD left, UWORD fheight)
{
ULONG tmp,tmp2,maxw1,maxw2;
ULONG strheight=fheight+2;
struct GadgetData *gd;
/* Init strings */
gdata[GAD_OK].name =AppStrings[MSG_WINDOW_OK_GAD];
gdata[GAD_CANCEL].name=AppStrings[MSG_WINDOW_CANCEL_GAD];
/* Calculate maximum label width for string gadgets */
maxw1=TextLength(&TmpRastPort,AppStrings[MSG_WINDOW_NAME_GAD],
strlen(AppStrings[MSG_WINDOW_NAME_GAD]));
tmp=TextLength(&TmpRastPort,AppStrings[MSG_IMAGEWIN_FILE_GAD],
strlen(AppStrings[MSG_IMAGEWIN_FILE_GAD]))+REQBUTTONWIDTH;
if (tmp > maxw1) maxw1=tmp;
maxw1+=INTERWIDTH;
/* Calculate minimal string gadgets width */
ww=TextLength(&TmpRastPort,
AppStrings[MSG_IMAGEWIN_NEWNAME],
strlen(AppStrings[MSG_IMAGEWIN_NEWNAME])
) + maxw1 + 3*INTERWIDTH;
/* Calculate button gadgets width */
gd=&gdata[GAD_OK];
maxw2=TextLength(&TmpRastPort,gd->name,strlen(gd->name));
gd++;
if ((tmp=TextLength(&TmpRastPort,gd->name,strlen(gd->name))) > maxw2)
maxw2=tmp;
maxw2+=2*INTERWIDTH;
if ((tmp=2*(maxw2+INTERWIDTH)) > ww) ww=tmp;
/* window height */
wh=3*fheight+4*INTERHEIGHT+4;
/* Init gadgets */
gd=gdata;
tmp=WindowTop+INTERHEIGHT;
tmp2=ww-maxw1-INTERWIDTH;
maxw1+=left;
/* Name string gadget */
gd->name=AppStrings[MSG_WINDOW_NAME_GAD];
gd->type=STRING_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=nametags;
gd->left=maxw1;
gd->top=tmp;
gd->width=tmp2;
gd->height=strheight;
tmp+=strheight+INTERHEIGHT;
/* File name button gadget */
gd++;
gd->type=GENERIC_KIND;
gd->flags=0;
gd->left=maxw1-REQBUTTONWIDTH;
gd->top=tmp;
gd->width=REQBUTTONWIDTH;
gd->height=strheight;
/* File name text gadget */
gd++;
gd->name=AppStrings[MSG_IMAGEWIN_FILE_GAD];
gd->type=TEXT_KIND;
gd->flags=PLACETEXT_LEFT;
gd->left=maxw1-REQBUTTONWIDTH;
gd->top=tmp+strheight/2;
gd->width=0;
gd->height=0;
/* File name string gadget */
gd++;
gd->type=STRING_KIND;
gd->tags=filetags;
gd->left=maxw1;
gd->top=tmp;
gd->width=tmp2;
gd->height=strheight;
tmp+=strheight+INTERHEIGHT;
/* OK button gadget */
gd++;
gd->type=BUTTON_KIND;
gd->flags=PLACETEXT_IN;
gd->left=left;
gd->top=tmp;
gd->width=maxw2;
gd->height=fheight;
/* Cancel button gadget */
gd++;
gd->type=BUTTON_KIND;
gd->flags=PLACETEXT_IN;
gd->left=ww-maxw2-INTERWIDTH+left;
gd->top=tmp;
gd->width=maxw2;
gd->height=fheight;
/* Init vanilla key array */
KeyArray[KEY_NAME] =FindVanillaKey(gdata[GAD_NAME_STR].name);
KeyArray[KEY_FILE] =FindVanillaKey(gdata[GAD_FILE_TXT].name);
KeyArray[KEY_OK] =FindVanillaKey(gdata[GAD_OK].name);
KeyArray[KEY_CANCEL]=FindVanillaKey(gdata[GAD_CANCEL].name);
/* Init dummy requester structure */
InitRequester(&DummyReq);
}
/* Free image node */
void FreeImageNode(struct Node *node)
{
struct ImageNode *in=(struct ImageNode *) node;
char *s;
if (s=in->in_Node.ln_Name) free(s);
if (s=in->in_File) free(s);
/* Free node */
FreeMem(in,sizeof(struct ImageNode));
}
/* Copy image node */
struct Node *CopyImageNode(struct Node *node)
{
struct ImageNode *in,*orignode=(struct ImageNode *) node;
/* Alloc memory for image node */
if (in=AllocMem(sizeof(struct ImageNode),MEMF_PUBLIC|MEMF_CLEAR)) {
/* Got an old node? */
if (orignode) {
/* Yes, copy it */
if ((!orignode->in_Node.ln_Name || (in->in_Node.ln_Name=
strdup(orignode->in_Node.ln_Name))) &&
(!orignode->in_File || (in->in_File=strdup(orignode->in_File))))
return(in);
} else
/* No, set defaults */
if ((in->in_Node.ln_Name=strdup(AppStrings[MSG_IMAGEWIN_NEWNAME])) &&
(!DirName || (in->in_File=strdup(DirName))))
/* Return pointer to new node */
return(in);
FreeImageNode((struct Node *) in);
}
/* Call failed */
return(NULL);
}
/* Create image node from WBArg */
struct Node *CreateImageNode(char *name, struct WBArg *wa)
{
struct ImageNode *in;
/* Alloc memory for image node */
if (in=AllocMem(sizeof(struct ImageNode),MEMF_PUBLIC|MEMF_CLEAR)) {
char *filebuf;
/* Init node */
if ((in->in_Node.ln_Name=strdup(name)) &&
(filebuf=malloc(4096))) {
/* Create & copy icon file name */
if (NameFromLock(wa->wa_Lock,filebuf,4096) &&
AddPart(filebuf,wa->wa_Name,4096) &&
(in->in_File=strdup(filebuf))) {
/* All OK. */
free(filebuf);
return(in);
}
free(filebuf);
}
FreeImageNode((struct Node *) in);
}
/* Call failed */
return(NULL);
}
/* Activate gadget and save pointer to it */
static void MyActivateGadget(ULONG num)
{
ActivateGadget(gdata[num].gadget,w,NULL);
}
/* Open image edit window */
BOOL OpenImageEditWindow(struct Node *node, struct Window *parent)
{
/* Copy node */
if (CurrentNode=(struct ImageNode *) CopyImageNode(node)) {
/* Set tags */
nametags[0].ti_Data=(ULONG) CurrentNode->in_Node.ln_Name;
filetags[0].ti_Data=(ULONG) CurrentNode->in_File;
/* Create gadgets */
if (gl=CreateGadgetList(gdata,GADGETS)) {
/* Open window */
if (w=OpenWindowTags(NULL,WA_Left, parent->LeftEdge,
WA_Top, parent->TopEdge+WindowTop,
WA_InnerWidth, ww,
WA_InnerHeight, wh,
WA_AutoAdjust, TRUE,
WA_Title, AppStrings[MSG_IMAGEWIN_TITLE],
WA_PubScreen, PublicScreen,
WA_Flags, WFLG_CLOSEGADGET|WFLG_DRAGBAR|
WFLG_DEPTHGADGET|WFLG_RMBTRAP|
WFLG_ACTIVATE,
TAG_DONE)) {
/* Add as AppWindow */
aw=NULL;
if (WorkbenchBase && WBScreen)
/* This call fails if the Workbench is NOT running! */
aw=AddAppWindowA(0,0,w,AppMsgPort,NULL);
/* Init requester button gadgets */
InitReqButtonGadget(gdata[GAD_FILE_BUT].gadget);
/* Add gadgets to window */
AddGList(w,gl,(UWORD) -1,(UWORD) -1,NULL);
RefreshGList(gl,w,NULL,(UWORD) -1);
GT_RefreshWindow(w,NULL);
/* Activate first gadget */
MyActivateGadget(GAD_NAME_STR);
/* Set local variables */
w->UserPort=IDCMPPort;
w->UserData=(BYTE *) HandleImageEditWindowIDCMP;
ModifyIDCMP(w,IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|BUTTONIDCMP|
STRINGIDCMP|IDCMP_VANILLAKEY);
CurrentWindow=w;
if (aw) HandleAppMsg=HandleImageEditWindowAppMsg;
/* Set up file requester parameters */
FileReqParms.frp_Window=w;
FileReqParms.frp_Title=AppStrings[MSG_FILEREQ_TITLE_FILE];
FileReqParms.frp_OKText=AppStrings[MSG_FILEREQ_OK_GAD];
FileReqParms.frp_Flags1=FRF_DOPATTERNS;
FileReqParms.frp_Flags2=0;
/* All OK. */
return(TRUE);
}
FreeGadgets(gl);
}
FreeImageNode((struct Node *) CurrentNode);
}
/* Call failed */
return(FALSE);
}
/* Close image edit window */
static void CloseImageEditWindow(void)
{
/* Free resources */
RemoveGList(w,gl,(UWORD) -1);
if (aw) {
HandleAppMsg=HandleMainWindowAppMsg;
RemoveAppWindow(aw);
}
CloseWindowSafely(w);
FreeGadgets(gl);
}
/* Handle application messages */
void HandleImageEditWindowAppMsg(struct AppMessage *msg)
{
struct WBArg *wa;
/* Get first argument */
if (wa=msg->am_ArgList) {
char *filebuf;
/* Allocate memory for name buffer */
if (filebuf=malloc(4096)) {
/* Build full file name */
if (NameFromLock(wa->wa_Lock,filebuf,4096) &&
AddPart(filebuf,wa->wa_Name,4096)) {
/* Set new gadget values */
GT_SetGadgetAttrs(gdata[GAD_NAME_STR].gadget,w,NULL,
GTST_String,wa->wa_Name,TAG_DONE);
GT_SetGadgetAttrs(gdata[GAD_FILE_STR].gadget,w,NULL,
GTST_String,filebuf,TAG_DONE);
}
free(filebuf);
}
}
}
/* File gadget function */
static void FileGadgetFunc(void)
{
char *file;
struct Gadget *g=gdata[GAD_FILE_STR].gadget;
/* Set file requester parameters */
FileReqParms.frp_OldFile=((struct StringInfo *) g->SpecialInfo)->Buffer;
/* Open file requester */
if (file=OpenFileRequester(&DummyReq)) {
char *path;
/* Set new file string */
GT_SetGadgetAttrs(g,w,NULL,GTST_String,file,TAG_DONE);
/* Get new path */
path=FilePart(file);
if (path!=file) {
/* Free old path */
if (DirName) free(DirName);
/* Set new path */
DirName=file;
*path='\0';
}
/* Activate string gadget */
MyActivateGadget(GAD_FILE_STR);
}
}
/* OK gadget function */
static struct Node *OKGadgetFunc(void)
{
struct Node *rc;
char *s;
/* Free old strings */
if (s=CurrentNode->in_Node.ln_Name) free(s);
CurrentNode->in_Node.ln_Name=NULL;
if (s=CurrentNode->in_File) free(s);
CurrentNode->in_File=NULL;
/* Duplicate new strings */
if (((CurrentNode->in_Node.ln_Name=
DuplicateBuffer(gdata[GAD_NAME_STR].gadget)) != (char *) -1) &&
((CurrentNode->in_File=
DuplicateBuffer(gdata[GAD_FILE_STR].gadget)) != (char *) -1)) {
char *s=CurrentNode->in_File;
ULONG len=strlen(s);
/* Strip trailing ".info" */
if ((len>=5) && !stricmp(s+len-5,".info")) s[len-5]='\0';
rc=(struct Node *) CurrentNode;
} else {
/* Couldn't copy strings */
rc=(struct Node *) -1;
FreeImageNode((struct Node *) CurrentNode);
}
return(rc);
}
/* Handle image edit window IDCMP events */
void *HandleImageEditWindowIDCMP(struct IntuiMessage *msg)
{
struct Node *NewNode=NULL;
/* Which IDCMP class? */
switch (msg->Class) {
case IDCMP_CLOSEWINDOW: NewNode=(struct Node *) -1;
FreeImageNode((struct Node *) CurrentNode);
break;
case IDCMP_REFRESHWINDOW: GT_BeginRefresh(w);
GT_EndRefresh(w,TRUE);
break;
case IDCMP_GADGETUP:
switch (((struct Gadget *) msg->IAddress)->GadgetID) {
case GAD_FILE_BUT: FileGadgetFunc();
break;
case GAD_OK: NewNode=OKGadgetFunc();
break;
case GAD_CANCEL: NewNode=(struct Node *) -1;
FreeImageNode((struct Node *) CurrentNode);
break;
}
break;
case IDCMP_VANILLAKEY:
switch (MatchVanillaKey(msg->Code,KeyArray)) {
case KEY_NAME: MyActivateGadget(GAD_NAME_STR);
break;
case KEY_FILE: FileGadgetFunc();
break;
case KEY_OK: NewNode=OKGadgetFunc();
break;
case KEY_CANCEL: NewNode=(struct Node *) -1;
FreeImageNode((struct Node *) CurrentNode);
break;
}
break;
}
/* Close window? */
if (NewNode) {
/* Yes. But first reply message!!! */
GT_ReplyIMsg(msg);
CloseImageEditWindow();
}
return(NewNode);
}
/* Read TMIM IFF chunk into Image node */
struct Node *ReadImageNode(UBYTE *buf)
{
struct ImageNode *in;
/* Allocate memory for node */
if (in=AllocMem(sizeof(struct ImageNode),MEMF_PUBLIC|MEMF_CLEAR)) {
struct ImagePrefsObject *ipo=(struct ImagePrefsObject *) buf;
ULONG sbits=ipo->ipo_StringBits;
UBYTE *ptr=(UBYTE *) &ipo[1];
if ((!(sbits & IMPO_NAME) || (in->in_Node.ln_Name=GetConfigStr(&ptr))) &&
(!(sbits & IMPO_FILE) || (in->in_File=GetConfigStr(&ptr))))
/* All OK. */
return(in);
/* Call failed */
FreeImageNode((struct Node *) in);
}
return(NULL);
}
/* Write Image node to TMIM IFF chunk */
BOOL WriteImageNode(struct IFFHandle *iff, UBYTE *buf, struct Node *node)
{
struct ImageNode *in=(struct ImageNode *) node;
struct ImagePrefsObject *ipo=(struct ImagePrefsObject *) buf;
ULONG sbits=0;
UBYTE *ptr=(UBYTE *) &ipo[1];
/* Copy strings */
if (PutConfigStr(in->in_Node.ln_Name,&ptr)) sbits|=IMPO_NAME;
if (PutConfigStr(in->in_File,&ptr)) sbits|=IMPO_FILE;
/* set string bits */
ipo->ipo_StringBits=sbits;
/* calculate length */
sbits=ptr-buf;
DEBUG_PRINTF("chunk size %ld\n",sbits);
/* Open chunk */
if (PushChunk(iff,0,ID_TMIM,sbits)) return(FALSE);
/* Write chunk */
if (WriteChunkBytes(iff,buf,sbits)!=sbits) return(FALSE);
/* Close chunk */
if (PopChunk(iff)) return(FALSE);
/* All OK. */
return(TRUE);
}